﻿/////////////////////////////////////////////////
//文件名:Block
//描  述:
//创建者:刘凡平(Iveely Liu)
//邮  箱:945222889@qq.com
//组  织:Iveely
//年  份:2012/5/10 13:34:33
///////////////////////////////////////////////


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using IveelySE.BigData.MasterNode;
using IveelySE.BigData.Common;

namespace IveelySE.BigData.StoreNode
{
    /// <summary>
    /// 文件块（一个大文件在一个节点上只有一个块，一个块可以由多个片段组成）
    /// </summary>
    [Serializable]
    public class Block
    {
        /// <summary>
        /// 大数据存储原始文件名（
        /// </summary>
        public string FileName { get; set; }

        /// <summary>
        /// 代码片段栈(为什么栈？因为栈顶是当前正在活跃的文件，更加利索活跃文件的操作)
        /// </summary>
        private List<Fragment> List { get; set; }

        /// <summary>
        /// 构造方法
        /// </summary>
        public Block()
        {
            this.List = new List<Fragment>();
        }

        /// <summary>
        /// 向此快中添加数据
        /// <param name="data">需要添加的数据</param>
        /// <param name="size">所添加数据的大小</param>
        /// </summary>
        public void Add(PObject data, int size)
        {
            //从栈中取出当前活跃块
            //如果栈中不存在
            if (this.List.Count < 1)
            {
                //新建片段
                Fragment fragment = new Fragment(data.fileName + ".0");
                //执行插入(新插入不需要判断是否大于其片段容量)
                fragment.Add(data, size);
                //加入到栈中
                this.List.Add(fragment);
            }
            //如果栈中不为空
            else
            {
                //在顶部片段中插入数据,如果失败
                if (!this.List[this.List.Count - 1].Add(data, size))
                {
                    //新建片段再次插入
                    Fragment fragment = new Fragment(data.fileName + "." + this.List.Count);
                    //执行插入
                    fragment.Add(data, size);
                    //加入到栈中
                    this.List.Add(fragment);
                }
            }
        }

        /// <summary>
        /// 查找某行的记录
        /// </summary>
        /// <param name="rowNum"></param>
        /// <returns></returns>
        public PObject Find(int rowNum)
        {
            //第一步找到对应的片段
            int framNum = rowNum / 100;
            //如果大于了记录中的值
            if (framNum - 1 > this.List.Count)
            {
                return null;
            }
            return this.List[framNum].Find(rowNum % 100);
        }
    }
}
